xend: pass-through: use identity-mapping of PCI functions
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 22 Jul 2009 13:05:26 +0000 (14:05 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 22 Jul 2009 13:05:26 +0000 (14:05 +0100)
This reverses changeset "xend: pass-through: Implement least-mapping
of virtual" (19854:22067ba1de0d) and reverts the code to identity
mapping physical PCI functions to virtual ones when multi-function
virtual devices are in use. It is my opinion that this is both safer
and simpler than least-mapping, and that in the absence of further
analysis identity-mapping the best choice for now.

Signed-off-by: Simon Horman <horms@verge.net.au>
tools/python/xen/util/pci.py
tools/python/xen/xm/main.py

index de5e619f4185cedd180f82035d261ab0c0dcc6fc..70758e4e4eed343d37d0c9acbfe263c1def1dcf2 100644 (file)
@@ -287,13 +287,19 @@ def parse_pci_name_extended(pci_dev_str):
     # Virtual slot assignment takes place here if specified in the bdf,
     # else it is done inside qemu-xen, as it knows which slots are free
     pci = []
-    vfunc = 0;
     func_list = pci_func_list_process(pci_dev_str, template,
                                       pci_dev_info['func'])
     for func in func_list:
         pci_dev = template.copy()
         pci_dev['func'] = "0x%x" % func
 
+        if len(func_list) == 1:
+            # For single-function devices vfunc must be 0
+            vfunc = 0
+        else:
+            # For multi-function virtual devices,
+            # identity map the func to vfunc
+            vfunc = func
         if pci_dev_info['vdevfn'] == '':
             vdevfn = AUTO_PHP_SLOT | vfunc
         else:
@@ -301,7 +307,6 @@ def parse_pci_name_extended(pci_dev_str):
         pci_dev['vdevfn'] = "0x%02x" % vdevfn
 
         pci.append(pci_dev)
-        vfunc += 1
 
     # For pci attachment and detachment is it important that virtual
     # function 0 is done last. This is because is virtual function 0 that
index 6397382f88780805ef1ed0cbb135b87540a9fe3a..9fef281e0f692b4ab8b53d1123a567caea1169de 100644 (file)
@@ -2226,17 +2226,9 @@ def xm_pci_list(args):
     if len(devs) == 0:
         return
 
-    def f(x):
-        # The vfunc shouldn't be used for ordering if the vslot hasn't been
-        # assigned as the output looks odd beacuse the vfunc isn't reported
-        # but the (physical) function is.
-        if x['vdevfn'] & AUTO_PHP_SLOT:
-            vdevfn = AUTO_PHP_SLOT
-        else:
-            vdevfn = x['vdevfn']
-        return (vdevfn << 32) | \
-                   PCI_BDF(x['domain'], x['bus'], x['slot'], x['func'])
-    devs.sort(None, f)
+    devs.sort(None,
+              lambda x: (x['vdevfn'] - PCI_FUNC(x['vdevfn'])) << 32 |
+                         PCI_BDF(x['domain'], x['bus'], x['slot'], x['func']))
 
     has_vdevfn = False
     for x in devs: